package com.itheima.controller;

import com.itheima.anno.Log;
import com.itheima.pojo.Dept;
import com.itheima.pojo.Result;
import com.itheima.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j//lombok提供的注解，用于简化日志输出
//简化代码private static Logger log = LoggerFactory. getLogger(Xxx. class);
@RequestMapping("/depts")//一个完整的请求路径，应该是类上的 @RequestMapping 的value属性 + 方法上的 @RequestMapping的value属性。
@RestController
// @RestController注解相当于@ResponseBody和@Controller的结合
//@Controller将控制层的类交给IOC容器管理
//@ResponseBody是将方法的返回值以特定的格式再响应给前端
public class DeptController {
    @Autowired
    private DeptService deptService;

    // 1.查询所有部门信息
    //@RequestMapping(value = "/depts", method = RequestMethod.GET) //method: 指定请求方式

    //@GetMapping("/depts") @GetMapping是一个组合注解，是@RequestMapping(method = RequestMethod.GET)的缩写表示请求的方式
    @GetMapping
    public Result findAll() {
         log.info("查询部门列表");
         List<Dept> deptList = deptService.findAll();
         return Result.success(deptList);
    }
/**
* 根据ID删除部门 - 简单参数接收: 方式一 (HttpServletRequest)
*/
//@DeleteMapping("/depts")
//public Result delete(HttpServletRequest request){
//    String idStr = request.getParameter("id");
//    int id = Integer.parseInt(idStr);
//
//    System.out.println("根据ID删除部门: " + id);
//    return Result.success();
//}
//通过Spring提供的 @RequestParam 注解，将请求参数绑定给方法形参
//@DeleteMapping("/depts")
//public Result deleteById(@RequestParam(value = "id",required = false) Integer deptId){
//
// System.out.println("根据ID删除部门: " + deptId);
//    return Result.success();
//
//}
//如果请求参数名与形参变量名相同，直接定义方法形参即可接收。（省略@RequestParam）
    //2.根据id删除部门
    @Log
    @DeleteMapping//是一个组合注解，是@RequestMapping(method = RequestMethod.DELETE)的缩写表示请求的方式
    public Result deleteById(Integer id){

        log.info("根据id删除部门, id: {}" , id);
        if (deptService.hasEmployees(id)) {
            return Result.error("对不起，当前部门下有员工，不能直接删除！");
        }
        deptService.deleteById(id);
        return Result.success();

    }
    //3.新增部门，上述删除部门的请求参数是在请求路径中，而新增部门的请求参数是在请求体中。
    //@RequestBody是SpringMVC提供的注解，用于获取请求体中的参数值。
//    - JSON格式的参数，通常会使用一个实体对象进行接收 。
//- 规则：JSON数据的键名与方法形参对象的属性名相同，并需要使用@RequestBody注解标识。


    //新增部门
    @Log
    @PostMapping
    public Result save(@RequestBody Dept dept){

        log.info("新增部门, dept: {}" , dept);
        deptService.save(dept);
        return Result.success();

    }

    //4.根据id修改部门
    //1.查询回显
    //@PathVariable是SpringMVC提供的注解，用于获取请求路径中的参数值。
     //如果路径参数名与controller方法形参名称一致，@PathVariable注解的value属性是可以省略的。
    //public Result save(@RequestBody("id") Integer dept)
    @GetMapping("/{id}")
    public Result findById(@PathVariable Integer id){

        log.info("根据ID查询, id: {}" , id);
        Dept dept = deptService.findById(id);
        return Result.success(dept);
    }

    //2.回显后进行修改
    @Log
    @PutMapping
    public Result update(@RequestBody Dept dept){

        log.info("修改部门, dept: {}" , dept);
        deptService.update(dept);
        return Result.success();

    }



}
